//================================================================================================
// File Name   : wing_cbb_mem_sim.sv
// Designer    : Peng Wei
// Mail        : peng.wei@wingsemitech.com
// Create Time : Tue Dec  5 16:00:53 2023
// Description :
// 
//================================================================================================

module wing_cbb_mem_sim #(
    parameter   DEPTH           = 2048,
    parameter   DATA_W          = 32,
    parameter   WSTB_RATIO_N    = 1,
    // DO NOT MODIFY FOLLOWING DERIVATIVE PARAMETERS !
    parameter   WSTB_W          = DATA_W / WSTB_RATIO_N,
    parameter   ADDR_W          = $clog2(DEPTH)
)(
    input  logic                    clk,
    input  logic                    cs,
    input  logic                    wr,     // 1'b1: write, 1'b0: read
    input  logic [ADDR_W-1:0]       addr,
    input  logic [DATA_W-1:0]       wdata,
    input  logic [WSTB_W-1:0]       we,
    output logic [DATA_W-1:0]       rdata
);

//===================================================================
// Local Variables 
//===================================================================
logic [DATA_W-1:0]  bwe;

bit mem[int unsigned];

// logic [DATA_W-1:0] mem [255:0];

for (genvar j=0; j<DATA_W; j++) begin : g_bwe
  assign bwe[j] = we[j/WSTB_RATIO_N];
end

//===================================================================
// Mem Model
//===================================================================
initial begin
  while(1) begin

  // SRAM Model Write
  if(cs & wr) begin
    for(integer i = 0 ; i < DATA_W ; i = i + 1) begin: ram_wr
      if(bwe[i]) begin
          mem[addr * DATA_W + i] = wdata[i];
      end
    end
  end

  // SRAM Model Read
  if(cs & !wr) begin
    for(integer i = 0 ; i < DATA_W ; i = i + 1) begin: ram_rd
      rdata[i] <= mem[addr * DATA_W + i];
    end
  end else begin
    rdata <= $random;
  end

  @(posedge clk);

  end
end

//==================================
// Assertions
//==================================

endmodule